package com.zenithmind.library.service;

import com.zenithmind.common.result.PageResult;
import com.zenithmind.library.pojo.query.BookQuery;
import com.zenithmind.library.pojo.vo.BookDetailVO;
import com.zenithmind.library.pojo.vo.BookVO;

import java.util.List;

/**
 * 图书查询服务接口
 * 遵循接口隔离原则：只包含查询相关的方法
 * 
 * @author ZenithMind
 * @since 2024-06-14
 */
public interface BookQueryService {

    /**
     * 分页查询图书
     * 
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<BookVO> getBookPage(BookQuery query);

    /**
     * 根据ID获取图书详情
     * 
     * @param id 图书ID
     * @return 图书详情
     */
    BookDetailVO getBookDetail(String id);

    /**
     * 根据分类查询图书
     * 
     * @param categoryId 分类ID
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<BookVO> getBooksByCategory(String categoryId, BookQuery query);

    /**
     * 根据作者查询图书
     * 
     * @param authorId 作者ID
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<BookVO> getBooksByAuthor(String authorId, BookQuery query);

    /**
     * 根据出版社查询图书
     * 
     * @param publisherId 出版社ID
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<BookVO> getBooksByPublisher(String publisherId, BookQuery query);

    /**
     * 搜索图书
     * 
     * @param keyword 关键词
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<BookVO> searchBooks(String keyword, BookQuery query);

    /**
     * 获取推荐图书
     * 
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<BookVO> getRecommendedBooks(BookQuery query);

    /**
     * 获取新书
     * 
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<BookVO> getNewBooks(BookQuery query);

    /**
     * 获取热门图书
     * 
     * @param query 查询条件
     * @return 分页结果
     */
    PageResult<BookVO> getPopularBooks(BookQuery query);

    /**
     * 根据ISBN查询图书
     * 
     * @param isbn ISBN
     * @return 图书信息
     */
    BookVO getBookByIsbn(String isbn);

    /**
     * 检查ISBN是否存在
     * 
     * @param isbn ISBN
     * @param excludeId 排除的ID
     * @return 是否存在
     */
    boolean checkIsbnExists(String isbn, String excludeId);

    /**
     * 获取相关图书推荐
     * 
     * @param bookId 图书ID
     * @param limit 限制数量
     * @return 相关图书列表
     */
    List<BookVO> getRelatedBooks(String bookId, Integer limit);
}
